package mysql8学习.高级.第11章_数据库的设计规范之范式;

/**
 * 第二范式
 * 第二范式要求，在满足第一范式的基础上，还要满足数据表里的每一条数据记录，都是可唯一标识的。
 * 而且所有非主键字段,都必须 "完全依赖主键",不能只依赖主键的一部分。
 *      比如组合主键(两个字段组成主键)
 * 如果知道主键的所有属性的值，就可以检索到任何元组(行)的任何属性的任何值。
 * (要求中的主键， 实可以拓展替换为候选键)。
 *
 * 比如 1
 * 成绩表(学号, 课程号,成绩)关系中，(学号, 课程号)可以决定成绩，
 * 但是学号不能决定成绩，课程号也不能决定成绩，
 * 所以“(学号,课程号)→成绩'就是完全依赖关系。
 * 比如 2
 * 比赛表player_game,里面包含球员编号、姓名、年龄、比赛编号、比赛时间和比赛场地等属性,
 * 这里候选键和主键都为(球员编号,比赛编号)，我们可以通过候选键(或主键)来决定如下的关系:
 * (球员编号，比赛编号) 一 (姓名，年龄，比赛时间，比赛场地，得分)
 * 球员编号                决定    姓名，年龄
 * 比赛编号                决定    比赛时间，比赛场地
 * 球员编号，比赛编号        决定    得分
 * 这样的话  一个表就不行了，这样不满足第二范式
 * 需要三张表
 * 球员表     球员编号，姓名，年龄
 * 比赛表     比赛编号，比赛时间，比赛场地
 * 得分表     球员编号，比赛编号，得分
 *
 * 对于非主属性来说，并非完全依赖候选键。这样会产生怎样的问题呢?
 * 1.数据冗余: 如果一个球员可以参加m场比赛，那么球员的姓名和年龄就重复了m-1次。
 *           一个比赛也可能会有n个球员参加，比赛的时间和地点就重复了n-1次。
 * 2.插入异常: 如果我们想要添加一场新的比赛，但是这时还没有确定参加的球员都有谁,那么就没法插入。
 * 3.删除异常: 如果我要删除某个球员编号，如果没有单独保存比赛表的话,就会同时把比赛信息删除掉。
 * 4.更新异常: 如果我们调整了某个比赛的时间，那么数据表中所有这个比赛的时间都需要进行调整，
 *            否则就会出现一场比赛时间不同的情况。
 *
 * 小结:第二范式(2NF) 要求实体的属性完全依赖主关键字。
 * 如果存在不完全依赖，那么这个属性和主关键字的这一部分应该分离出来形成一 个新的实体，
 * 新实体与元实体之间是一对多的关系。
 *
 */
public class C2_第二范式 {
}
